package br.com.sisgerenciamento.model.pedido;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import br.com.sisgerenciamento.dto.cliente.ClienteDTO;
import br.com.sisgerenciamento.dto.pedido.PedidoDTO;
import br.com.sisgerenciamento.dto.produtoquantidade.ProdutoQuantidadeDTO;
import br.com.sisgerenciamento.dto.recebimento.RecebimentoDTO;
import br.com.sisgerenciamento.model.cliente.ClienteVO;
import br.com.sisgerenciamento.model.endereco.EnderecoVO;
import br.com.sisgerenciamento.model.locacao.LocacaoVO;
import br.com.sisgerenciamento.model.produtoquantidade.ProdutoQuantidadeVO;
import br.com.sisgerenciamento.model.recebimento.RecebimentoVO;
import br.com.sisgerenciamento.model.usuario.UsuarioVO;
import br.com.sisgerenciamento.utilidades.TreatDate;
import br.com.sisgerenciamento.utilidades.TreatNumber;

@Entity
@Table(name = "PEDIDO")
public class PedidoVO {

	@Id
	@GeneratedValue
	private Long codigo;

	@Temporal(TemporalType.TIMESTAMP)
	private Date dataHoraEmissao;

	@Temporal(TemporalType.DATE)
	private Date dataEntrega;

	private Integer horaEntrega;

	@Enumerated(EnumType.ORDINAL)
	private TipoEntregaEnum entrega;

	@Column(length = 15)
	private String telefone;
	
	@Column(length = 15)
	private String telefone2;

	@Column(length = 15)
	private String celular;

	@Column(length = 15)
	private String celular2;

	@Enumerated(EnumType.ORDINAL)
	private StatusPedidoEnum status;

	private BigDecimal desconto;

	private BigDecimal acrescimo;

	private BigDecimal subTotal;

	private BigDecimal total;
	
	private Boolean impressoCozinha;
	
	@Column(length = 60)
	private String referencia;

	@ManyToOne(fetch =  FetchType.EAGER)
	@JoinColumn(name = "usuario")
	private UsuarioVO usuario;

	@Column(length = 255)
	private String observacao;

	@ManyToOne(fetch =  FetchType.EAGER)
	private ClienteVO cliente;

	@ManyToOne(fetch =  FetchType.EAGER)
	private EnderecoVO endereco;

	@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER )
	@JoinColumn(name="locacao_id")
	private LocacaoVO locacaoVO;

	@OneToMany(mappedBy = "pedido", fetch = FetchType.EAGER ,cascade = CascadeType.ALL)
	@JoinColumn(name = "pedido_id")
	private Set<ProdutoQuantidadeVO> produtos;

	@OneToMany(mappedBy = "pedido", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
	private Set<RecebimentoVO> recebimentos;


	public PedidoDTO getDTO(){

		PedidoDTO dto = new PedidoDTO();
		dto.setImpressoCozinha(getImpressoCozinha());
		dto.setCodigo(getCodigo().toString());
		try {
			dto.setAcrescimo(TreatNumber.convertMonetario(getAcrescimo()));
			dto.setDesconto(TreatNumber.convertMonetario(getDesconto()));
			dto.setTotal(TreatNumber.convertMonetario(getTotal()));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		dto.setCelular(getCelular() != null ? getCelular() : "");
		dto.setCliente(getCliente() != null ? getCliente().getDTO() : new ClienteDTO());
		dto.setDataEntrega(TreatDate.formatDefaultDate(getDataEntrega()));
		dto.setDataHoraEmissao(TreatDate.format("dd/MM/yyyy HH:mm", getDataHoraEmissao()));
		dto.setEndereco(getEndereco() != null ? getEndereco().getDTO() : null);
		dto.setEntrega(getEntrega() != null ? getEntrega().getValor() : null);
		if(getHoraEntrega() != null ){
			int size = getHoraEntrega().toString().length();
			if(size == 1){
				dto.setHoraEntrega("000"+getHoraEntrega());
			}else if(size == 2){
				dto.setHoraEntrega("00"+getHoraEntrega());
			}else if(size == 3){
				dto.setHoraEntrega("0"+getHoraEntrega());
			}else{
				dto.setHoraEntrega(getHoraEntrega().toString());
			}
		}
		if(getLocacaoVO() != null){
			dto.setLocacaoDTO(getLocacaoVO().getDTO());
		}
		dto.setObservacao(getObservacao());
		dto.setProdutos( new ArrayList<ProdutoQuantidadeDTO>());
		if(getProdutos() != null){
			for (ProdutoQuantidadeVO produQuantidadeVO : getProdutos()) {
				dto.getProdutos().add(produQuantidadeVO.getDTO());
			}
		}
		dto.setRecebimentos(new ArrayList<RecebimentoDTO>());
		if(getRecebimentos() != null){
			for (RecebimentoVO recebimentoVO : getRecebimentos()) {
				dto.getRecebimentos().add(recebimentoVO.getDTO());
			}
		}

		dto.setStatus(getStatus().getValor());
		dto.setSubTotal(getSubTotal() != null ? getSubTotal().toString() : "");
		dto.setTelefone(getTelefone());
		dto.setTelefone2(getTelefone2());
		dto.setCelular2(getCelular2());
		dto.setUsuario(getUsuario().getDTO());
		dto.setReferencia(getReferencia());

		return dto;

	}

	public Long getCodigo() {
		return codigo;
	}
	public void setCodigo(Long codigo) {
		this.codigo = codigo;
	}
	public Date getDataHoraEmissao() {
		return dataHoraEmissao;
	}
	public void setDataHoraEmissao(Date dataHoraEmissao) {
		this.dataHoraEmissao = dataHoraEmissao;
	}
	public Date getDataEntrega() {
		return dataEntrega;
	}
	public void setDataEntrega(Date dataEntrega) {
		this.dataEntrega = dataEntrega;
	}
	public Integer getHoraEntrega() {
		return horaEntrega;
	}
	public void setHoraEntrega(Integer horaEntrega) {
		this.horaEntrega = horaEntrega;
	}
	public TipoEntregaEnum getEntrega() {
		return entrega;
	}
	public void setEntrega(TipoEntregaEnum entrega) {
		this.entrega = entrega;
	}
	public String getTelefone() {
		return telefone;
	}
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	public String getCelular() {
		return celular;
	}
	public void setCelular(String celular) {
		this.celular = celular;
	}
	public StatusPedidoEnum getStatus() {
		return status;
	}
	public void setStatus(StatusPedidoEnum status) {
		this.status = status;
	}
	public BigDecimal getDesconto() {
		return desconto;
	}
	public void setDesconto(BigDecimal desconto) {
		this.desconto = desconto;
	}
	public BigDecimal getAcrescimo() {
		return acrescimo;
	}
	public void setAcrescimo(BigDecimal acrescimo) {
		this.acrescimo = acrescimo;
	}
	public String getObservacao() {
		return observacao;
	}
	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}
	public UsuarioVO getUsuario() {
		return usuario;
	}
	public void setUsuario(UsuarioVO usuario) {
		this.usuario = usuario;
	}
	public BigDecimal getTotal() {
		return total;
	}
	public void setTotal(BigDecimal total) {
		this.total = total;
	}
	public BigDecimal getSubTotal() {
		return subTotal;
	}
	public void setSubTotal(BigDecimal subTotal) {
		this.subTotal = subTotal;
	}
	public ClienteVO getCliente() {
		return cliente;
	}
	public void setCliente(ClienteVO cliente) {
		this.cliente = cliente;
	}
	public EnderecoVO getEndereco() {
		return endereco;
	}
	public void setEndereco(EnderecoVO endereco) {
		this.endereco = endereco;
	}
	public Set<ProdutoQuantidadeVO> getProdutos() {
		return produtos;
	}
	public void setProdutos(Set<ProdutoQuantidadeVO> produtos) {
		this.produtos = produtos;
	}
	public LocacaoVO getLocacaoVO() {
		return locacaoVO;
	}
	public void setLocacaoVO(LocacaoVO locacaoVO) {
		this.locacaoVO = locacaoVO;
	}
	public Set<RecebimentoVO> getRecebimentos() {
		return recebimentos;
	}
	public void setRecebimentos(Set<RecebimentoVO> recebimentos) {
		this.recebimentos = recebimentos;
	}
	public String getTelefone2() {
		return telefone2;
	}
	public void setTelefone2(String telefone2) {
		this.telefone2 = telefone2;
	}
	public String getCelular2() {
		return celular2;
	}
	public void setCelular2(String celular2) {
		this.celular2 = celular2;
	}

	public String getReferencia() {
		return referencia;
	}

	public void setReferencia(String referencia) {
		this.referencia = referencia;
	}

	public Boolean getImpressoCozinha() {
		return impressoCozinha;
	}

	public void setImpressoCozinha(Boolean impressoCozinha) {
		this.impressoCozinha = impressoCozinha;
	}
	

}
